#include "ff.h"
#include "diskio.h"
#include "fatfs.h"

#include <stdio.h>

static FATFS obj_SD_Card;
static BYTE FLAG_SD_INIT = 0;

const TCHAR* ERROR_TEXT_STRING[] = {
	"FR_OK",				/* (0) Succeeded */
	"FR_DISK_ERR",			/* (1) A hard error occured in the low level disk I/O layer */
	"FR_INT_ERR",				/* (2) Assertion failed */
	"FR_NOT_READY",			/* (3) The physical drive cannot work */
	"FR_NO_FILE",				/* (4) Could not find the file */
	"FR_NO_PATH",				/* (5) Could not find the path */
	"FR_INVALID_NAME",		/* (6) The path name format is invalid */
	"FR_DENIED",				/* (7) Acces denied due to prohibited access or directory full */
	"FR_EXIST",				/* (8) Acces denied due to prohibited access */
	"FR_INVALID_OBJECT",		/* (9) The file/directory object is invalid */
	"FR_WRITE_PROTECTED",		/* (10) The physical drive is write protected */
	"FR_INVALID_DRIVE",		/* (11) The logical drive number is invalid */
	"FR_NOT_ENABLED",			/* (12) The volume has no work area */
	"FR_NO_FILESYSTEM",		/* (13) There is no valid FAT volume */
	"FR_MKFS_ABORTED",		/* (14) The f_mkfs() aborted due to any parameter error */
	"FR_TIMEOUT",				/* (15) Could not get a grant to access the volume within defined period */
	"FR_LOCKED",				/* (16) The operation is rejected according to the file shareing policy */
	"FR_NOT_ENOUGH_CORE",		/* (17) LFN working buffer could not be allocated */
	"FR_TOO_MANY_OPEN_FILES",	/* (18) Number of open files > _FS_SHARE */
	"FR_INVALID_PARAMETER"	/* (19) Given parameter is invalid */
};

BYTE SD_Card_Init(void)
{
  FRESULT L_RESULT;
  if(FLAG_SD_INIT == 0)
  {
    L_RESULT = f_mount(SD_CARD_FAT_VOLUME,&obj_SD_Card);
    if(L_RESULT == FR_OK)
    {
      FLAG_SD_INIT = 1;
      return (BYTE)1;
    }
    else
    {
      printf("Can't init SD Card : %s\n",FATFS_MES(L_RESULT));
      return (BYTE)0;
    }
  }
  return (BYTE)0;
}

void SD_Card_DeInit(void)
{
  if(FLAG_SD_INIT == 1)
  {
    f_mount(SD_CARD_FAT_VOLUME,NULL);
    FLAG_SD_INIT = 0;
  }
}

BYTE Is_SD_Card_Init(void)
{
  
  return FLAG_SD_INIT;
}